//! 协议头
//! 用来子节点与主节点进行通信的协议头
//! 
//! head.rs
//! 
//! (RUST) alone
//! 
//! Create time: 2025-09-26		alone
//! Update time: 2025-09-26		alone
//! 

use std::mem::size_of;

/// 协议 verify 校验值
pub const VERIFY_MAGIC: u16 = 0xfefe;
/// 协议版本
pub const HEAD_VERSION: u8 = 1;
/// 协议头去除 verify 字节的大小
pub const HEAD_SIZE_EXCEPT_VERIFY: usize = size_of::<ProtocolHead>() - size_of::<u32>();
/// 协议头字节大小
pub const HEAD_SIZE: usize = size_of::<ProtocolHead>();

use bytemuck::{Pod, Zeroable};

/// 消息类型
enum MessageType
{
	/// 心跳消息
	Heart = 0,
	/// 请求消息
	Request = 1,
	/// 响应消息
	Response = 2,
	/// 推送消息
	Push = 3,
}

/// 协议头
#[repr(C)]
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
pub struct ProtocolHead 
{
	/// 消息头校验
	pub verify: u16,
	/// 协议版本(如果协议版本不匹配将拒绝)
	pub version: u8,
	/// 消息类型
	pub mtype: u8,
	/// 数据长度
	pub len: u32,
}

impl ProtocolHead {
	/// 创建一个新的协议头
	pub fn new(mtype: u8, len: u32) 
		-> Self 
	{
		Self 
		{ 
			verify: VERIFY_MAGIC, 
			version: HEAD_VERSION, 
			mtype,
			len,
		}
	}

	/// 创建一个空的协议头
	pub fn empty() 
		-> Self 
	{
		Self 
		{ 
			verify: VERIFY_MAGIC, 
			version: HEAD_VERSION, 
			mtype: 0,
			len: 0,
		}
	}

	/// 协议头的复制品
	/// 主要用来接收到协议头后进行复制
	pub fn replica(
		verify: u16, 
		version: u8, 
		mtype: u8,
		len: u32
	) 
		-> Self 
	{
			Self 
			{ 
				verify, 
				version, 
				mtype, 
				len
			}
	}
}